class Solution {
public:
    bool num_of(string&S,int i)
    {
        int re=0;
        for(int j=S.size()-1;j>=i;j--)
        {
            if(S[j]=='*')
            {
                re++;
            }
        }

        if(re*2==S.size()-i-1)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    bool isMatch(string s, string p) {
        //进栈
        if(p.size()==0||s.size()==0)
        {
            return false;
        }
        stack<char>s1;
        stack<char>p1;
        // int size=p1.size();
        // while(size--)
        // {
        //     p1.push(p1[size])
        // }
        //遍历小的那个
        
        for(int i=0;i<p.size();i++)
        {
            
            if(i==0)
            {
                s1.push(s[0]);
            }
            //小是.，另一个可以是任何字符
            if(p[i]=='.'||p[i]==s1.top())
            {
                //双方最后一个相同
                if(i==p.size()-1&&s1.size()==s.size())
                {
                    return true;
                }
                if(s1.size()!=s.size())
                {
                    s1.push(s[s1.size()]);
                    if(i==p.size()-1)
                    {
                        //s还有新数据push数据而p已经无了
                        return false;
                    }
                    continue;
                }
                else
                {
                    if(i<p.size()-1)
                    {
                        //检测后面
                        if(num_of(p,i))
                        {
                            return true;
                        }
                        if(i+2==p.size()&&p[i+1]=='*')
                        {
                            return true;
                        }
                        return false;
                    }
                    else
                    {
                        return false;
                    }
                }

            }
            if(p[i]=='*')
            {
                cout<<"yes";
                if(p[i-1]=='.'&&i==p.size()-1)
                {cout<<"yes";
                    return true;
                }
                if(p[i-1]!=s1.top()&&p[i-1]!='.')
                {
                    if(s1.size()==s.size())
                    {
                        return true;
                    }
                   cout<<"yes";
                    continue;
                }
                else
                {
                    if(p[i-1]==s1.top())
                    {
                        //把相同的都装进去
                        while(s[s1.size()]==s1.top())
                        {
                            s1.push(s[s1.size()]);
                        }
                    }
                    else
                    {
                        //把p+1不相同的都装进去
                        if(i<p.size()-1)//.*后面还有元素
                        {
                            while(p[i+1]!=s[s1.size()])
                            {
                                //这里就装完了肯定不匹配
                                if(s1.size()==s.size())
                                {
                                    return false;
                                }
                                s1.push(s[s1.size()]);
                            }
                        }

                    }
                    //如果这里s已经装完了那p后面2n个至少要有n个*
                    
                    if(s1.size()==s.size())
                    {

                    }
                    //有剩下
                    else{s1.push(s[s1.size()]);cout<<s1.size()<<" ";}
                    
                }
            }


        }
        if(s1.size()==s.size())
        {
            return true;
        }
        else
        {
            return false;
        }
        
    }
};